setwd("~/Documents/github/UNIGE/32M7129/Cours_01")
if (!require("ggplot2")) install.packages("ggplot2")## Le chargement a nécessité le package : ggplot2
if (!require("rmarkdown")) install.packages("rmarkdown")## Le chargement a nécessité le package : rmarkdown
Avez-vous bien installé: * Le langage R * Le logiciel Rstudio * Le logiciel Gephi
Les cours se trouvent en ligne à l’adresse suivante: https://github.com/gabays/32M7129 * Github permet de partager du code * Chaque est donc du code transformé en slides * Vous trouverez y trouverez donc le code, et les slides
L’objectif de ce cours est
Pour chacune de ces deux étapes, les données subissent une transformation 1.Elle passent à travers un filtre mathématique (calcul de distance, algorithme…) 2. Elles subissent une déformation graphique (passage de n-dimensions à deux, perspective…)
Trois exemples de visualisation: * La carte de Snow * Le diagramme de Minard * Le Mémorial de Maya Lin
h:20 center
Source: wikipedia
100% center
Source: wikipedia
100% center
Source: wikipedia
100% center
Source: wikipedia
Jacques Bertin (1967), Sémiologie graphique. Les diagrammes. Les réseaux. Les cartes, Paris/La Haye, Mouton ; Paris, Gauthier-Villars.
“La graphique”: un système dont les éléments, ou signes, ont une signification fixée à l’avance et unique, ce qu’exprime par exemple la légende d’une carte (1973, 6).
“Efficacité graphique”: “si pour obtenir une réponse correcte et complète à une question donnée, et, toutes choses égales, une construction requiert un temps d’observation plus court qu’une autre construction, on dira qu’elle est plus efficace pour cette question”. (1967, 139)
Il y a un glissement de la représentation qui se doit d’être exhautive, précise et complète, à la représentation qui se doit d’être effiface.
George Kingsley Zipf, Human Behaviour and the Principle of Least Effort: An Introduction to Human Ecology 1949
Une observation : Plus un mot est fréquent, plus il est court.
Cela implique que la variété, la probabilité et la distribution des mots est presque la même pour beaucoup de langues.
L’homme qui parle tend à réduire le vocabulaire en rassemblant derrière un simple mot une multitude de significations.
Corollaire de la loi du moindre effort: “coût mental de la perception” (Palsky 2017), selon laquelle le temps de perception entre une construction efficace et une inefficace est extrêmement nette.
J. Bertin propose une grammaire graphique afin d’améliorer l’efficacité des rendus
100% center
Source: Palsky 2017/Bertin 1967
Les exemples précédemment présentés proviennent des travaux d’Edward Tufte (1942-),
Quelques concepts importants:
Surreprésentation ou sous-représentation ce qui se trouve dans les données
100% center
Proportion d’encre utilisée pour la représentation des données par rapport à l’encre utilisé pour l’ensemble du graphique
100% center
Source: info-vis wiki
Il s’agit de la proportion du graph dédiée à la représentation des données.
Source: pparacch
Se traduit en français par “bruit graphique” (littéralement “tableau déchet”).
« Les décorations intérieures aux graphiques sont autant d’encre qui ne dit rien de nouveau au lecteur. La raison d’être de la décoration varie — faire apparaitre le graphique comme plus scientifique et précis [expert], vivifier le style, donner la possibilité à l’illustrateur de faire la preuve de ses talents artistiques. Quelle qu’en soit la raison, c’est autant d’encre-sans-information ou d’encre-répétant l’information, et donc souvent du chartjunk [bruit graphique inutile]. »
100% center
Elle permet de commenter une courbe dans la phrase, sans
ajouter aucun chiffre, pour expliquer une tendance (ici un léger
regain).
Source: Pew research center
Moretti tente d’analyser un “système mondial de la littérature” sur des principes similaires à ceux de l’économiste Immanuel Wallerstein (et de l’historien Fernand Braudel), qui analyse le “système-monde” sur la base de rapports qu’entretiennent le “centre”, la “semi-périphérie” et la “périphérie”.
Une telle approche requiert un très grand nombre de documents: il devient impossible de pratiquer ce que les anglo-saxons appellent le close reading (commentaire de texte): il faut prendre de la hauteur et essayer un distant reading.
100% center
Source: Moretti 2005
Prof. à UCLA
« La posture qui domine dans le champ du design d’information repose presque entièrement sur l’idée que les données pré-existent à leur affichage et que la tâche qui consiste à leur donner une forme visuelle consiste purement à transformer un exercice cognitif en un exercice perceptif. Si la valeur d’un design d’information intelligent dans l’interprétation de données statistiques ne saurait être surestimée, et ne pas prendre cela en compte serait ridicule, les limites de cette approche doivent aussi être soulignées. Pourquoi? Parce qu’elle restreint les conditions de la connaissance en suggérant que l’information existe indépendamment de sa présentation visuelle et attend simplement de recevoir la «meilleure» forme dans laquelle elle pourra être représentée.» (Drucker 2004)
La “simple” question du design a désormais débouché sur des interrogations plus larges qui relèvent de l’interaction homme-machine (IHM, Human–computer interaction).
On peut additionner des chiffres (int pour integer, “entier”)
1+2## [1] 3
Il est en revanche impossible d’additionner un chiffre avec une lettre (str, pour string, “chaîne (de caractères”): Error in 1 + “b” : non-numeric argument to binary operator
#1+"b"On remarque que les str sont notés entre guillemets. On peut ainsi spécifier qu’un chiffre est utilisé comme caractère et non comme un chiffre en utilisant les guillemets: il est alors impossible de s’en servir pour un calcul
#"1"+2Cette distinction entre str et int est fondamentale dès lors que l’on veut visualiser des données. Dans de nombreux cas, la visualisation nécessite de manipulation les données, or celles-ci peuvent être réalisées parfois sur des str ou int, mais dans certains cas uniquement sur des int. Un exemple tout simple serait l’addition: on ne peut effectuer l’addition “4+voiture” dans la vraie vie comme dans un ordinateur.
On va parler de données “catégorielles” et de données “métriques”. La différence entre ces types de données est majeure, car elle va limiter les visualisations possibles: s’il est possible de faire une AFC ou de construire avec des données catégorielles, il est impossible de faire un ACP sans des données métriques. Il en va de même pour construire un arbre de décision (données catégorielles et métriques) et une régression linéaire (données métriques uniquement).
Texte 1 > « Rome, l’unique objet de mon ressentiment ! > Rome, à qui vient ton bras d’immoler mon amant ! > Rome qui t’a vu naître, et que ton cœur adore ! > Rome enfin que je hais parce qu’elle t’honore ! »
Corneille, Camille dans Horace, acte IV, scène 5
Texte 2 > « Rome, par une loi, qui ne se peut changer, > N’admet avec son sang aucun sang étranger, > Et ne reconnaît point les fruits illégitimes, > Qui naissent d’un hymen contraire à ses maximes. »
Racine, Bérénice, acte II, scène 2
Prenons la fréquence de deux mots uniquement: “Rome” et “qui”
| Token | Corneille | Racine |
|---|---|---|
| Rome | 4 | 2 |
| qui | 2 | 1 |
On crée deux vecteurs qui contiennent ces informations:
x <- c(4,2)
y <- c(2,1)
x## [1] 4 2
y## [1] 2 1
On les replace sur un plan:
png(file="images/plot1.png")
plot(x,y)
dev.off()100% center
On rajoute quelques informations pour faciliter la lecture du graphique
png(file="images/plot2.png")
plot(x,y, xlab="abscisse", ylab="ordonnée",
main="mon plan", pch=16, col="green")
dev.off()100% center
Ces points représentent des faits linguistiques calculés à partir des fréquences dans notre corpus. L’écart qui sépare ces points représente l’écart entre deux pratiques stylistiques:
png(file="images/plot3.png")
plot(x,y, xlab="abscisse", ylab="ordonnée",
main="mon plan (2)", pch=16, col="green")
s <- seq(length(x)-1) # one shorter than data
segments(x[s], y[s], x[s+1], y[s+1], col= 1:3)
dev.off()70% center
Il faut donc calculer comment aller du point A au point B
png(file="images/plot4.png")
plot(x,y, xlab="abscisse", ylab="ordonnée",
main="mon plan (3)", pch=16, col="green")
s <- seq(length(x)-1) # one shorter than data
arrows(x[s], y[s], x[s+1], y[s+1], col= 'pink')
dev.off()100% center
On peut complexifier le problème en ajoutant un troisième auteur: > C’est Rome qui demande nos larmes : Rome ! La Maîtresse de l’univers ; Rome ! Mère féconde des héros, et les délices des Dieux ; Rome ! Qui humiliait l’orgueil des tyrans de la Terre, et qui brillait les fers des Nations hélas !
Boyer, Caton, Acte IV, scène XII
Cela nous donne le tableau suivant:
| Token | Corneille | Racine | Boyer |
|---|---|---|---|
| “Rome” | 4 | 2 | 3 |
| “qui” | 2 | 1 | 2 |
Nous obtenons donc un nouveau graph:
x <- c(4,2,3)
y <- c(2,1,2)
png(file="images/plot5.png")
plot(x,y, xlab="abscisse", ylab="ordonnée",
main="mon plan (4)", pch=16, col="green")
s <- seq(length(x)-1) # one shorter than data
segments(x[s], y[s], x[s+1], y[s+1], col= 1:3)
segments(x[s], y[s], x[s+2], y[s+2])
text(x=3.95, y=1.9, labels="Corneille")
text(x=3.1, y=1.95, labels="Boyer")
text(x=2.2, y=1, labels="Racine")
dev.off()60% center
Il est donc possible de calculer la distance entre ces trois textes pour voir lesquels sont potentiellement les plus similaires, par exemple avec une distance euclidienne.
(Pour rappel, la distance entre deux points A et B est la racine carrée de la somme des carrés des différences de coordonnées en X et en Y.)
100% center
En faisant un rapide calcul, on peut donc confirmer notre validation par nos calculs de distance:
# sqrt((x1-x2)**2+(y1-y2)**2)
CoRa <- sqrt((4-2)**2+(2-1)**2)
cat("Distance Corneille/Racine = ", CoRa, "\n")## Distance Corneille/Racine = 2.236068
CoBo <- sqrt((4-3)**2+(2-2)**2)
cat("Distance Corneille/Boyer = ", CoBo, "\n")## Distance Corneille/Boyer = 1
RaBo <- sqrt((2-3)**2+(1-2)**2)
cat("Distance Racine/Boyer = ", RaBo)## Distance Racine/Boyer = 1.414214
On intègre les distances dans le plan
x <- c(4,2,3)
y <- c(2,1,2)
png(file="images/plot6.png")
plot(x,y, xlab="abscisse", ylab="ordonnée",
main="mon plan (5)", pch=16, col="green")
s <- seq(length(x)-1) # one shorter than data
segments(x[s], y[s], x[s+1], y[s+1], col="red")
segments(x[s], y[s], x[s+2], y[s+2], col="red")
text(x=3.95, y=1.9, labels="Corneille", col="black")
text(x=3.1, y=1.95, labels="Boyer", col="black")
text(x=2.2, y=1, labels="Racine", col="black")
text(x=3, y=1.4, labels="2.2", col="blue") #CoRa
text(x=2.5, y=1.6, labels="1.4", col="blue") # RaBo
text(x=3.4, y=1.95, labels="1", col="blue") # CoBo
legend("topleft", legend=c("Auteur", "Dist. euclidienne"),
text.col = c("black", "blue"), cex=0.8)
dev.off()160% center
Exactement comme pour le texte, on doit passer par des chiffres pour travailler avec des images. Une image se compose de trois couleurs: rouge, vert et bleu. C’est le mélange de ces trois couleurs qui permet d’obtenir le résultat souhaité. Ainsi:
| Couleur | R | G | B |
|---|---|---|---|
| Noir | 255 | 215 | 0 |
| Rouge | 255 | 0 | 0 |
| Jaune | 255 | 255 | 255 |
Ces couleurs RGB sont souvent converties en triplet hexadécimal, soit un nombre hexadécimal à 6 chiffres mémorisé sur trois octets, pour simplifier le travail
| Couleur | R | G | B | Hexadécimal |
|---|---|---|---|---|
| Noir | 255 | 215 | 0 | #000000 |
| Rouge | 255 | 0 | 0 | #ff0000 |
| Jaune | 255 | 255 | 255 | #ffff00 |
| ## Une image très simple |
| Si nous prenons une couleur en RGB, il est utile en R de la transformer en triplet hexadécimal. Pour cela nous créons une fonction |
r rgb2hex <- function(r,g,b) rgb(r, g, b, maxColorValue = 255) |
| Et nous transformons la couleur rouge en triplet, que l’on stocke dans une variable appelée “rouge” |
r red<- rgb2hex(255,0,0) #ff0000 |
On peut ensuite afficher une image simple: un carré rouge.
png(file="images/image1.png")
plot(c(100, 200), c(100, 100), type= "n", xlab = "", ylab = "")
rect(210, 150, 1, 1, col = red)
dev.off()100% center
Notre image précédente étant une simple case vide, nous pouvons multiplier les cases à colorier. Pour cela, il faut créer une matrice (un tableau) à remplir: on assigne une couleur à chaque cellule, et nous obtiendrons une image
x=1:3
matrix(x, nrow=1, ncol=length(x))## [,1] [,2] [,3]
## [1,] 1 2 3
On crée deux autres codes hexadécimaux à partir des codes RGB des couleurs et l’on remplit le tableau:
yellow<-rgb2hex(255,215,0) #ffff00"
black<-rgb2hex(0,0,0) #000000
png(file="images/image2.png")
image(1,1:length(x), matrix(x, nrow=1, ncol=length(x)),
col=c(yellow,red,black))
dev.off()150% center